// 浅拷贝只是拷贝一层, 更深层次对象级别的只拷贝引用(地址)
var obj = {
    id: 1,
    name: 'hind',
    msg: {
        age: 22
    }
};
var o = {};
// for (var k in obj) {
//     // k 是属性名   obj[k] 属性值
//     o[k] = obj[k];
// }
// console.log(o);
// o.msg.age = 20;
// console.log(obj);

console.log('--------------');
// Object.assign(目标文件， 原文件)  浅拷贝的方法
Object.assign(o, obj);
console.log(o);
o.msg.age = 20;
console.log(obj);
// 结果就是 o 和 obj 的 msg.age 都变成了20, 因为 o 和 obj 是共享一块内存的



// 1. 使用递归的方式实现深拷贝
// 深拷贝拷贝多层, 每一级别的数据都会拷贝.
var obj = {
    id: 1,
    name: 'hind',
    msg: {
        age: 22
    },
    color: ['bluee', 'yellow']
};

var o = {};
// 封装函数
function deepCopy(newobj, oldobj) {
    for (var k in oldobj) {
        // 判断我们的属性值属于那种数据类型
        // 1. 获取属性值  oldobj[k]
        var item = oldobj[k];
        // 2. 判断这个值是否是数组(首先判断数组是因为数组也属于对象)
        if (item instanceof Array) {
            newobj[k] = [];
            deepCopy(newobj[k], item);
        } else if (item instanceof Object) {
            // 3. 判断这个值是否是对象
            newobj[k] = {};
            deepCopy(newobj[k], item);
        } else {
            // 4. 属于简单数据类型
            newobj[k] = item;
        }
    }
};
deepCopy(o, obj);
o.msg.age = 20;
console.log(o);
console.log(obj);   // obj.msg.age 还是等于 22 没有改变
var arr = [];
console.log(arr instanceof Object);  // true 数组也是对象
